//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS SageMakerGeospatial service.
///
/// Provides APIs for creating and managing SageMaker geospatial resources.
public struct SageMakerGeospatial: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the SageMakerGeospatial client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "SageMakerGeospatial",
            serviceIdentifier: "sagemaker-geospatial",
            serviceProtocol: .restjson,
            apiVersion: "2020-05-27",
            endpoint: endpoint,
            errorType: SageMakerGeospatialErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }





    // MARK: API Calls

    /// Use this operation to delete an Earth Observation job.
    @Sendable
    @inlinable
    public func deleteEarthObservationJob(_ input: DeleteEarthObservationJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteEarthObservationJobOutput {
        try await self.client.execute(
            operation: "DeleteEarthObservationJob", 
            path: "/earth-observation-jobs/{Arn}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Use this operation to delete an Earth Observation job.
    ///
    /// Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the Earth Observation job being deleted.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteEarthObservationJob(
        arn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteEarthObservationJobOutput {
        let input = DeleteEarthObservationJobInput(
            arn: arn
        )
        return try await self.deleteEarthObservationJob(input, logger: logger)
    }

    /// Use this operation to delete a Vector Enrichment job.
    @Sendable
    @inlinable
    public func deleteVectorEnrichmentJob(_ input: DeleteVectorEnrichmentJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteVectorEnrichmentJobOutput {
        try await self.client.execute(
            operation: "DeleteVectorEnrichmentJob", 
            path: "/vector-enrichment-jobs/{Arn}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Use this operation to delete a Vector Enrichment job.
    ///
    /// Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the Vector Enrichment job being deleted.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteVectorEnrichmentJob(
        arn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteVectorEnrichmentJobOutput {
        let input = DeleteVectorEnrichmentJobInput(
            arn: arn
        )
        return try await self.deleteVectorEnrichmentJob(input, logger: logger)
    }

    /// Use this operation to export results of an Earth Observation job and optionally source images used as input to the EOJ to an Amazon S3 location.
    @Sendable
    @inlinable
    public func exportEarthObservationJob(_ input: ExportEarthObservationJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> ExportEarthObservationJobOutput {
        try await self.client.execute(
            operation: "ExportEarthObservationJob", 
            path: "/export-earth-observation-job", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Use this operation to export results of an Earth Observation job and optionally source images used as input to the EOJ to an Amazon S3 location.
    ///
    /// Parameters:
    ///   - arn: The input Amazon Resource Name (ARN) of the Earth Observation job being exported.
    ///   - clientToken: A unique token that guarantees that the call to this API is idempotent.
    ///   - executionRoleArn: The Amazon Resource Name (ARN) of the IAM role that you specified for the job.
    ///   - exportSourceImages: The source images provided to the Earth Observation job being exported.
    ///   - outputConfig: An object containing information about the output file.
    ///   - logger: Logger use during operation
    @inlinable
    public func exportEarthObservationJob(
        arn: String,
        clientToken: String? = ExportEarthObservationJobInput.idempotencyToken(),
        executionRoleArn: String,
        exportSourceImages: Bool? = nil,
        outputConfig: OutputConfigInput,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ExportEarthObservationJobOutput {
        let input = ExportEarthObservationJobInput(
            arn: arn, 
            clientToken: clientToken, 
            executionRoleArn: executionRoleArn, 
            exportSourceImages: exportSourceImages, 
            outputConfig: outputConfig
        )
        return try await self.exportEarthObservationJob(input, logger: logger)
    }

    /// Use this operation to copy results of a Vector Enrichment job to an Amazon S3 location.
    @Sendable
    @inlinable
    public func exportVectorEnrichmentJob(_ input: ExportVectorEnrichmentJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> ExportVectorEnrichmentJobOutput {
        try await self.client.execute(
            operation: "ExportVectorEnrichmentJob", 
            path: "/export-vector-enrichment-jobs", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Use this operation to copy results of a Vector Enrichment job to an Amazon S3 location.
    ///
    /// Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the Vector Enrichment job.
    ///   - clientToken: A unique token that guarantees that the call to this API is idempotent.
    ///   - executionRoleArn: The Amazon Resource Name (ARN) of the IAM rolewith permission to upload to the location in OutputConfig.
    ///   - outputConfig: Output location information for exporting Vector Enrichment Job results.
    ///   - logger: Logger use during operation
    @inlinable
    public func exportVectorEnrichmentJob(
        arn: String,
        clientToken: String? = ExportVectorEnrichmentJobInput.idempotencyToken(),
        executionRoleArn: String,
        outputConfig: ExportVectorEnrichmentJobOutputConfig,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ExportVectorEnrichmentJobOutput {
        let input = ExportVectorEnrichmentJobInput(
            arn: arn, 
            clientToken: clientToken, 
            executionRoleArn: executionRoleArn, 
            outputConfig: outputConfig
        )
        return try await self.exportVectorEnrichmentJob(input, logger: logger)
    }

    /// Get the details for a previously initiated Earth Observation job.
    @Sendable
    @inlinable
    public func getEarthObservationJob(_ input: GetEarthObservationJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> GetEarthObservationJobOutput {
        try await self.client.execute(
            operation: "GetEarthObservationJob", 
            path: "/earth-observation-jobs/{Arn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Get the details for a previously initiated Earth Observation job.
    ///
    /// Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the Earth Observation job.
    ///   - logger: Logger use during operation
    @inlinable
    public func getEarthObservationJob(
        arn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetEarthObservationJobOutput {
        let input = GetEarthObservationJobInput(
            arn: arn
        )
        return try await self.getEarthObservationJob(input, logger: logger)
    }

    /// Use this operation to get details of a specific raster data collection.
    @Sendable
    @inlinable
    public func getRasterDataCollection(_ input: GetRasterDataCollectionInput, logger: Logger = AWSClient.loggingDisabled) async throws -> GetRasterDataCollectionOutput {
        try await self.client.execute(
            operation: "GetRasterDataCollection", 
            path: "/raster-data-collection/{Arn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Use this operation to get details of a specific raster data collection.
    ///
    /// Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the raster data collection.
    ///   - logger: Logger use during operation
    @inlinable
    public func getRasterDataCollection(
        arn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetRasterDataCollectionOutput {
        let input = GetRasterDataCollectionInput(
            arn: arn
        )
        return try await self.getRasterDataCollection(input, logger: logger)
    }

    /// Gets a web mercator tile for the given Earth Observation job.
    @Sendable
    @inlinable
    public func getTile(_ input: GetTileInput, logger: Logger = AWSClient.loggingDisabled) async throws -> GetTileOutput {
        try await self.client.execute(
            operation: "GetTile", 
            path: "/tile/{z}/{x}/{y}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets a web mercator tile for the given Earth Observation job.
    ///
    /// Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the tile operation.
    ///   - executionRoleArn: The Amazon Resource Name (ARN) of the IAM role that you specify.
    ///   - imageAssets: The particular assets or bands to tile.
    ///   - imageMask: Determines whether or not to return a valid data mask.
    ///   - outputDataType: The output data type of the tile operation.
    ///   - outputFormat: The data format of the output tile. The formats include .npy, .png and .jpg.
    ///   - propertyFilters: Property filters for the imagery to tile.
    ///   - target: Determines what part of the Earth Observation job to tile. 'INPUT' or 'OUTPUT' are the valid options.
    ///   - timeRangeFilter: Time range filter applied to imagery to find the images to tile.
    ///   - x: The x coordinate of the tile input.
    ///   - y: The y coordinate of the tile input.
    ///   - z: The z coordinate of the tile input.
    ///   - logger: Logger use during operation
    @inlinable
    public func getTile(
        arn: String,
        executionRoleArn: String? = nil,
        imageAssets: [String],
        imageMask: Bool? = nil,
        outputDataType: OutputType? = nil,
        outputFormat: String? = nil,
        propertyFilters: String? = nil,
        target: TargetOptions,
        timeRangeFilter: String? = nil,
        x: Int,
        y: Int,
        z: Int,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetTileOutput {
        let input = GetTileInput(
            arn: arn, 
            executionRoleArn: executionRoleArn, 
            imageAssets: imageAssets, 
            imageMask: imageMask, 
            outputDataType: outputDataType, 
            outputFormat: outputFormat, 
            propertyFilters: propertyFilters, 
            target: target, 
            timeRangeFilter: timeRangeFilter, 
            x: x, 
            y: y, 
            z: z
        )
        return try await self.getTile(input, logger: logger)
    }

    /// Retrieves details of a Vector Enrichment Job for a given job Amazon Resource Name (ARN).
    @Sendable
    @inlinable
    public func getVectorEnrichmentJob(_ input: GetVectorEnrichmentJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> GetVectorEnrichmentJobOutput {
        try await self.client.execute(
            operation: "GetVectorEnrichmentJob", 
            path: "/vector-enrichment-jobs/{Arn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves details of a Vector Enrichment Job for a given job Amazon Resource Name (ARN).
    ///
    /// Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the Vector Enrichment job.
    ///   - logger: Logger use during operation
    @inlinable
    public func getVectorEnrichmentJob(
        arn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetVectorEnrichmentJobOutput {
        let input = GetVectorEnrichmentJobInput(
            arn: arn
        )
        return try await self.getVectorEnrichmentJob(input, logger: logger)
    }

    /// Use this operation to get a list of the Earth Observation jobs associated with the calling Amazon Web Services account.
    @Sendable
    @inlinable
    public func listEarthObservationJobs(_ input: ListEarthObservationJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> ListEarthObservationJobOutput {
        try await self.client.execute(
            operation: "ListEarthObservationJobs", 
            path: "/list-earth-observation-jobs", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Use this operation to get a list of the Earth Observation jobs associated with the calling Amazon Web Services account.
    ///
    /// Parameters:
    ///   - maxResults: The total number of items to return.
    ///   - nextToken: If the previous response was truncated, you receive this token. Use it in your next request to receive the next set of results.
    ///   - sortBy: The parameter by which to sort the results.
    ///   - sortOrder: An optional value that specifies whether you want the results sorted in Ascending or Descending order.
    ///   - statusEquals: A filter that retrieves only jobs with a specific status.
    ///   - logger: Logger use during operation
    @inlinable
    public func listEarthObservationJobs(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        sortBy: String? = nil,
        sortOrder: SortOrder? = nil,
        statusEquals: EarthObservationJobStatus? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListEarthObservationJobOutput {
        let input = ListEarthObservationJobInput(
            maxResults: maxResults, 
            nextToken: nextToken, 
            sortBy: sortBy, 
            sortOrder: sortOrder, 
            statusEquals: statusEquals
        )
        return try await self.listEarthObservationJobs(input, logger: logger)
    }

    /// Use this operation to get raster data collections.
    @Sendable
    @inlinable
    public func listRasterDataCollections(_ input: ListRasterDataCollectionsInput, logger: Logger = AWSClient.loggingDisabled) async throws -> ListRasterDataCollectionsOutput {
        try await self.client.execute(
            operation: "ListRasterDataCollections", 
            path: "/raster-data-collections", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Use this operation to get raster data collections.
    ///
    /// Parameters:
    ///   - maxResults: The total number of items to return.
    ///   - nextToken: If the previous response was truncated, you receive this token. Use it in your next request to receive the next set of results.
    ///   - logger: Logger use during operation
    @inlinable
    public func listRasterDataCollections(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListRasterDataCollectionsOutput {
        let input = ListRasterDataCollectionsInput(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listRasterDataCollections(input, logger: logger)
    }

    /// Lists the tags attached to the resource.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/tags/{ResourceArn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the tags attached to the resource.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource you want to tag.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Retrieves a list of vector enrichment jobs.
    @Sendable
    @inlinable
    public func listVectorEnrichmentJobs(_ input: ListVectorEnrichmentJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> ListVectorEnrichmentJobOutput {
        try await self.client.execute(
            operation: "ListVectorEnrichmentJobs", 
            path: "/list-vector-enrichment-jobs", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves a list of vector enrichment jobs.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of items to return.
    ///   - nextToken: If the previous response was truncated, you receive this token. Use it in your next request to receive the next set of results.
    ///   - sortBy: The parameter by which to sort the results.
    ///   - sortOrder: An optional value that specifies whether you want the results sorted in Ascending or Descending order.
    ///   - statusEquals: A filter that retrieves only jobs with a specific status.
    ///   - logger: Logger use during operation
    @inlinable
    public func listVectorEnrichmentJobs(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        sortBy: String? = nil,
        sortOrder: SortOrder? = nil,
        statusEquals: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListVectorEnrichmentJobOutput {
        let input = ListVectorEnrichmentJobInput(
            maxResults: maxResults, 
            nextToken: nextToken, 
            sortBy: sortBy, 
            sortOrder: sortOrder, 
            statusEquals: statusEquals
        )
        return try await self.listVectorEnrichmentJobs(input, logger: logger)
    }

    /// Allows you run image query on a specific raster data collection to get a list of the satellite imagery matching the selected filters.
    @Sendable
    @inlinable
    public func searchRasterDataCollection(_ input: SearchRasterDataCollectionInput, logger: Logger = AWSClient.loggingDisabled) async throws -> SearchRasterDataCollectionOutput {
        try await self.client.execute(
            operation: "SearchRasterDataCollection", 
            path: "/search-raster-data-collection", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Allows you run image query on a specific raster data collection to get a list of the satellite imagery matching the selected filters.
    ///
    /// Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the raster data collection.
    ///   - nextToken: If the previous response was truncated, you receive this token. Use it in your next request to receive the next set of results.
    ///   - rasterDataCollectionQuery: RasterDataCollectionQuery consisting of AreaOfInterest(AOI), PropertyFilters and  TimeRangeFilterInput used in SearchRasterDataCollection.
    ///   - logger: Logger use during operation
    @inlinable
    public func searchRasterDataCollection(
        arn: String,
        nextToken: String? = nil,
        rasterDataCollectionQuery: RasterDataCollectionQueryWithBandFilterInput,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SearchRasterDataCollectionOutput {
        let input = SearchRasterDataCollectionInput(
            arn: arn, 
            nextToken: nextToken, 
            rasterDataCollectionQuery: rasterDataCollectionQuery
        )
        return try await self.searchRasterDataCollection(input, logger: logger)
    }

    /// Use this operation to create an Earth observation job.
    @Sendable
    @inlinable
    public func startEarthObservationJob(_ input: StartEarthObservationJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> StartEarthObservationJobOutput {
        try await self.client.execute(
            operation: "StartEarthObservationJob", 
            path: "/earth-observation-jobs", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Use this operation to create an Earth observation job.
    ///
    /// Parameters:
    ///   - clientToken: A unique token that guarantees that the call to this API is idempotent.
    ///   - executionRoleArn: The Amazon Resource Name (ARN) of the IAM role that you specified for the job.
    ///   - inputConfig: Input configuration information for the Earth Observation job.
    ///   - jobConfig: An object containing information about the job configuration.
    ///   - kmsKeyId: The Key Management Service key ID for server-side encryption.
    ///   - name: The name of the Earth Observation job.
    ///   - tags: Each tag consists of a key and a value.
    ///   - logger: Logger use during operation
    @inlinable
    public func startEarthObservationJob(
        clientToken: String? = StartEarthObservationJobInput.idempotencyToken(),
        executionRoleArn: String,
        inputConfig: InputConfigInput,
        jobConfig: JobConfigInput,
        kmsKeyId: String? = nil,
        name: String,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartEarthObservationJobOutput {
        let input = StartEarthObservationJobInput(
            clientToken: clientToken, 
            executionRoleArn: executionRoleArn, 
            inputConfig: inputConfig, 
            jobConfig: jobConfig, 
            kmsKeyId: kmsKeyId, 
            name: name, 
            tags: tags
        )
        return try await self.startEarthObservationJob(input, logger: logger)
    }

    /// Creates a Vector Enrichment job for the supplied job type.  Currently, there are two supported job types: reverse geocoding and map matching.
    @Sendable
    @inlinable
    public func startVectorEnrichmentJob(_ input: StartVectorEnrichmentJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> StartVectorEnrichmentJobOutput {
        try await self.client.execute(
            operation: "StartVectorEnrichmentJob", 
            path: "/vector-enrichment-jobs", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a Vector Enrichment job for the supplied job type.  Currently, there are two supported job types: reverse geocoding and map matching.
    ///
    /// Parameters:
    ///   - clientToken: A unique token that guarantees that the call to this API is idempotent.
    ///   - executionRoleArn: The Amazon Resource Name (ARN) of the IAM role that you specified for the job.
    ///   - inputConfig: Input configuration information for the Vector Enrichment job.
    ///   - jobConfig: An object containing information about the job configuration.
    ///   - kmsKeyId: The Key Management Service key ID for server-side encryption.
    ///   - name: The name of the Vector Enrichment job.
    ///   - tags: Each tag consists of a key and a value.
    ///   - logger: Logger use during operation
    @inlinable
    public func startVectorEnrichmentJob(
        clientToken: String? = StartVectorEnrichmentJobInput.idempotencyToken(),
        executionRoleArn: String,
        inputConfig: VectorEnrichmentJobInputConfig,
        jobConfig: VectorEnrichmentJobConfig,
        kmsKeyId: String? = nil,
        name: String,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartVectorEnrichmentJobOutput {
        let input = StartVectorEnrichmentJobInput(
            clientToken: clientToken, 
            executionRoleArn: executionRoleArn, 
            inputConfig: inputConfig, 
            jobConfig: jobConfig, 
            kmsKeyId: kmsKeyId, 
            name: name, 
            tags: tags
        )
        return try await self.startVectorEnrichmentJob(input, logger: logger)
    }

    /// Use this operation to stop an existing earth observation job.
    @Sendable
    @inlinable
    public func stopEarthObservationJob(_ input: StopEarthObservationJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> StopEarthObservationJobOutput {
        try await self.client.execute(
            operation: "StopEarthObservationJob", 
            path: "/earth-observation-jobs/stop", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Use this operation to stop an existing earth observation job.
    ///
    /// Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the Earth Observation job being stopped.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopEarthObservationJob(
        arn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StopEarthObservationJobOutput {
        let input = StopEarthObservationJobInput(
            arn: arn
        )
        return try await self.stopEarthObservationJob(input, logger: logger)
    }

    /// Stops the  Vector Enrichment job for a given job ARN.
    @Sendable
    @inlinable
    public func stopVectorEnrichmentJob(_ input: StopVectorEnrichmentJobInput, logger: Logger = AWSClient.loggingDisabled) async throws -> StopVectorEnrichmentJobOutput {
        try await self.client.execute(
            operation: "StopVectorEnrichmentJob", 
            path: "/vector-enrichment-jobs/stop", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Stops the  Vector Enrichment job for a given job ARN.
    ///
    /// Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the Vector Enrichment job.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopVectorEnrichmentJob(
        arn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StopVectorEnrichmentJobOutput {
        let input = StopVectorEnrichmentJobInput(
            arn: arn
        )
        return try await self.stopVectorEnrichmentJob(input, logger: logger)
    }

    /// The resource you want to tag.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/tags/{ResourceArn}", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// The resource you want to tag.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource you want to tag.
    ///   - tags: Each tag consists of a key and a value.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [String: String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// The resource you want to untag.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/tags/{ResourceArn}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// The resource you want to untag.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource you want to untag.
    ///   - tagKeys: Keys of the tags you want to remove.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }
}

extension SageMakerGeospatial {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: SageMakerGeospatial, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension SageMakerGeospatial {
    /// Return PaginatorSequence for operation ``listEarthObservationJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listEarthObservationJobsPaginator(
        _ input: ListEarthObservationJobInput,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListEarthObservationJobInput, ListEarthObservationJobOutput> {
        return .init(
            input: input,
            command: self.listEarthObservationJobs,
            inputKey: \ListEarthObservationJobInput.nextToken,
            outputKey: \ListEarthObservationJobOutput.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listEarthObservationJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The total number of items to return.
    ///   - sortBy: The parameter by which to sort the results.
    ///   - sortOrder: An optional value that specifies whether you want the results sorted in Ascending or Descending order.
    ///   - statusEquals: A filter that retrieves only jobs with a specific status.
    ///   - logger: Logger used for logging
    @inlinable
    public func listEarthObservationJobsPaginator(
        maxResults: Int? = nil,
        sortBy: String? = nil,
        sortOrder: SortOrder? = nil,
        statusEquals: EarthObservationJobStatus? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListEarthObservationJobInput, ListEarthObservationJobOutput> {
        let input = ListEarthObservationJobInput(
            maxResults: maxResults, 
            sortBy: sortBy, 
            sortOrder: sortOrder, 
            statusEquals: statusEquals
        )
        return self.listEarthObservationJobsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listRasterDataCollections(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listRasterDataCollectionsPaginator(
        _ input: ListRasterDataCollectionsInput,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListRasterDataCollectionsInput, ListRasterDataCollectionsOutput> {
        return .init(
            input: input,
            command: self.listRasterDataCollections,
            inputKey: \ListRasterDataCollectionsInput.nextToken,
            outputKey: \ListRasterDataCollectionsOutput.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listRasterDataCollections(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The total number of items to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listRasterDataCollectionsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListRasterDataCollectionsInput, ListRasterDataCollectionsOutput> {
        let input = ListRasterDataCollectionsInput(
            maxResults: maxResults
        )
        return self.listRasterDataCollectionsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listVectorEnrichmentJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listVectorEnrichmentJobsPaginator(
        _ input: ListVectorEnrichmentJobInput,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListVectorEnrichmentJobInput, ListVectorEnrichmentJobOutput> {
        return .init(
            input: input,
            command: self.listVectorEnrichmentJobs,
            inputKey: \ListVectorEnrichmentJobInput.nextToken,
            outputKey: \ListVectorEnrichmentJobOutput.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listVectorEnrichmentJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of items to return.
    ///   - sortBy: The parameter by which to sort the results.
    ///   - sortOrder: An optional value that specifies whether you want the results sorted in Ascending or Descending order.
    ///   - statusEquals: A filter that retrieves only jobs with a specific status.
    ///   - logger: Logger used for logging
    @inlinable
    public func listVectorEnrichmentJobsPaginator(
        maxResults: Int? = nil,
        sortBy: String? = nil,
        sortOrder: SortOrder? = nil,
        statusEquals: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListVectorEnrichmentJobInput, ListVectorEnrichmentJobOutput> {
        let input = ListVectorEnrichmentJobInput(
            maxResults: maxResults, 
            sortBy: sortBy, 
            sortOrder: sortOrder, 
            statusEquals: statusEquals
        )
        return self.listVectorEnrichmentJobsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``searchRasterDataCollection(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func searchRasterDataCollectionPaginator(
        _ input: SearchRasterDataCollectionInput,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<SearchRasterDataCollectionInput, SearchRasterDataCollectionOutput> {
        return .init(
            input: input,
            command: self.searchRasterDataCollection,
            inputKey: \SearchRasterDataCollectionInput.nextToken,
            outputKey: \SearchRasterDataCollectionOutput.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``searchRasterDataCollection(_:logger:)``.
    ///
    /// - Parameters:
    ///   - arn: The Amazon Resource Name (ARN) of the raster data collection.
    ///   - rasterDataCollectionQuery: RasterDataCollectionQuery consisting of AreaOfInterest(AOI), PropertyFilters and  TimeRangeFilterInput used in SearchRasterDataCollection.
    ///   - logger: Logger used for logging
    @inlinable
    public func searchRasterDataCollectionPaginator(
        arn: String,
        rasterDataCollectionQuery: RasterDataCollectionQueryWithBandFilterInput,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<SearchRasterDataCollectionInput, SearchRasterDataCollectionOutput> {
        let input = SearchRasterDataCollectionInput(
            arn: arn, 
            rasterDataCollectionQuery: rasterDataCollectionQuery
        )
        return self.searchRasterDataCollectionPaginator(input, logger: logger)
    }
}

extension SageMakerGeospatial.ListEarthObservationJobInput: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> SageMakerGeospatial.ListEarthObservationJobInput {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            sortBy: self.sortBy,
            sortOrder: self.sortOrder,
            statusEquals: self.statusEquals
        )
    }
}

extension SageMakerGeospatial.ListRasterDataCollectionsInput: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> SageMakerGeospatial.ListRasterDataCollectionsInput {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension SageMakerGeospatial.ListVectorEnrichmentJobInput: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> SageMakerGeospatial.ListVectorEnrichmentJobInput {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            sortBy: self.sortBy,
            sortOrder: self.sortOrder,
            statusEquals: self.statusEquals
        )
    }
}

extension SageMakerGeospatial.SearchRasterDataCollectionInput: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> SageMakerGeospatial.SearchRasterDataCollectionInput {
        return .init(
            arn: self.arn,
            nextToken: token,
            rasterDataCollectionQuery: self.rasterDataCollectionQuery
        )
    }
}
